package com.sicheng.蓝桥.练习题.dp.数位;

import java.util.Scanner;

/**
 * @author zsc
 * @version 1.0
 * @date 2022/5/31 11:45
 */
@SuppressWarnings("unused")
public class 数位问题 {
    /**
     * 给定两个整数 a 和 b，求 a 和 b 之间的所有数字中 0∼9 的出现次数。
     *
     * 例如，a=1024，b=1032，则 a 和 b 之间共有 9 个数如下：
     *
     * 1024 1025 1026 1027 1028 1029 1030 1031 1032
     *
     * 其中 0 出现 10 次，1 出现 10 次，2 出现 7 次，3 出现 3 次等等…
     *
     * 输入格式
     * 输入包含多组测试数据。
     *
     * 每组测试数据占一行，包含两个整数 a 和 b。
     *
     * 当读入一行为 0 0 时，表示输入终止，且该行不作处理。
     *
     * 输出格式
     * 每组数据输出一个结果，每个结果占一行。
     *
     * 每个结果包含十个用空格隔开的数字，第一个数字表示 0 出现的次数，第二个数字表示 1 出现的次数，以此类推。
     *
     * 数据范围
     * 0<a,b<100000000
     * 输入样例：
     * 1 10
     * 44 497
     * 346 542
     * 1199 1748
     * 1496 1403
     * 1004 503
     * 1714 190
     * 1317 854
     * 1976 494
     * 1001 1960
     * 0 0
     * 输出样例：
     * 1 2 1 1 1 1 1 1 1 1
     * 85 185 185 185 190 96 96 96 95 93
     * 40 40 40 93 136 82 40 40 40 40
     * 115 666 215 215 214 205 205 154 105 106
     * 16 113 19 20 114 20 20 19 19 16
     * 107 105 100 101 101 197 200 200 200 200
     * 413 1133 503 503 503 502 502 417 402 412
     * 196 512 186 104 87 93 97 97 142 196
     * 398 1375 398 398 405 499 499 495 488 471
     * 294 1256 296 296 296 296 287 286 286 247
     */
    // 计算整数n有多少位
    static int dgt(int n) {
        int res = 0;
        while (n > 0) {
            ++res;
            n /= 10;
        }
        return res;
    }

    // 计算从1到n的整数中数字i出现多少次
    //只需要知道，当i为0时其左边整数不能为0，就够了。
    static int cnt(int n, int i) {
        int res = 0, d = dgt(n);
        // 从右到左第j位上数字i出现多少次
        for (int j = 1; j <= d; ++j) {
            // l和r是第j位左边和右边的整数 (视频中的abc和efg); dj是第j位的数字
            int p = (int) Math.pow(10, j - 1), l = n / p / 10, r = n % p, dj = n / p % 10;
            // 计算第j位左边的整数小于l (视频中xxx = 000 ~ abc - 1)的情况
            if (i > 0)
                res += l * p;
            else if (l > 0)
                res += (l - 1) * p; // 如果i = 0, 左边高位不能全为0(视频中xxx = 001 ~ abc - 1)
            // 计算第j位左边的整数等于l (视频中xxx = abc)的情况
            if ((dj > i) && (i > 0 || l > 0))
                res += p;
            if ((dj == i) && (i > 0 || l > 0))
                res += r + 1;
        }
        return res;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a;
        int b;
        while ((a = scanner.nextInt()) != 0 && (b = scanner.nextInt()) != 0) {

            for (int i = 0; i < 10; i++) {
                // f(b,i)-f(a-1,i)
                if (b > a)
                    System.out.print(cnt(b, i) - cnt(a - 1, i) + " ");
                else
                    System.out.print(cnt(a, i) - cnt(b - 1, i) + " ");
            }
            System.out.println();
        }
    }


}
